package com.scott.Single;

/**
 * 懒汉式（静态内部类)
 *  这种写法解决了线程安全问题，同时还解决了性能问题
 *
 *  这种实现并不能保证在java反射的时候安全，所有的手动的私有化构造方法，都能够通过java的反射获取类对象，并通过设置constructor的访问属性为true，即可进行实例化
 *  所以如果为了保证反射的问题，在private的构造方法中做处理，可以在这个方法中抛出一个异常
 *
 *  类加载、类转载到JVM的过程
 *  从上到下进行（必须声明在前，使用在后）
 *  先属性、后方法
 *  先静态、后动态
 *
 */
public class Singleton4 {
    /**
     * 声明一个静态的内部类
     * private 私有的保证不被外部修改
     * static 保证全局唯一
     */
    private static class LazyHolder{
        /**
         * final 不可修改变动，防止无论内部还是外部的修改
          */
        private static final Singleton4 INSTANCE = new Singleton4();
    }

    /**
     * 私有化的构造方法
     */
    private Singleton4(){
    }

    /**
     * 提供Public的静态方法获取实例
     * final 确保不能被覆盖
     * @return 实例
     */
    public static final Singleton4 getInstance(){

        return LazyHolder.INSTANCE;
    }
}
